home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / ENET.C < prev    next >
C/C++ Source or Header  |  1989-08-11  |  3KB  |  141 lines

  1. /* Stuff generic to all Ethernet controllers */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "iface.h"
  6. #include "timer.h"
  7. #include "arp.h"
  8. #include "ip.h"
  9. #include "enet.h"
  10.  
  11. char Ether_bdcst[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  12.  
  13. /* Convert Ethernet header in host form to network mbuf */
  14. struct mbuf *
  15. htonether(ether,data)
  16. struct ether *ether;
  17. struct mbuf *data;
  18. {
  19.     struct mbuf *bp;
  20.     register char *cp;
  21.  
  22.     if((bp = pushdown(data,ETHERLEN)) == NULLBUF)
  23.         return NULLBUF;
  24.  
  25.     cp = bp->data;
  26.  
  27.     memcpy(cp,ether->dest,EADDR_LEN);
  28.     cp += EADDR_LEN;
  29.     memcpy(cp,ether->source,EADDR_LEN);
  30.     cp += EADDR_LEN;
  31.     put16(cp,ether->type);
  32.  
  33.     return bp;
  34. }
  35. /* Extract Ethernet header */
  36. int
  37. ntohether(ether,bpp)
  38. struct ether *ether;
  39. struct mbuf **bpp;
  40. {
  41.     pullup(bpp,ether->dest,EADDR_LEN);
  42.     pullup(bpp,ether->source,EADDR_LEN);
  43.     ether->type = pull16(bpp);
  44.     return ETHERLEN;
  45. }
  46.  
  47. /* Format an Ethernet address into a printable ascii string */
  48. int
  49. pether(out,addr)
  50. char *out,*addr;
  51. {
  52.     return sprintf(out,"%02x:%02x:%02x:%02x:%02x:%02x",
  53.         uchar(addr[0]),uchar(addr[1]),
  54.         uchar(addr[2]),uchar(addr[3]),
  55.         uchar(addr[4]),uchar(addr[5]));
  56. }
  57.  
  58. /* Convert an Ethernet address from Hex/ASCII to binary */
  59. int
  60. gether(out,cp)
  61. register char *out;
  62. register char *cp;
  63. {
  64.     register int i;
  65.  
  66.     for(i=6; i!=0; i--){
  67.         *out++ = htoi(cp);
  68.         if((cp = strchr(cp,':')) == NULLCHAR)    /* Find delimiter */
  69.             break;
  70.         cp++;            /* and skip over it */
  71.     }
  72.     return i;
  73. }
  74. /* Send an IP datagram on Ethernet */
  75. int
  76. enet_send(bp,iface,gateway,prec,del,tput,rel)
  77. struct mbuf *bp;    /* Buffer to send */
  78. struct iface *iface;    /* Pointer to interface control block */
  79. int32 gateway;        /* IP address of next hop */
  80. int prec;
  81. int del;
  82. int tput;
  83. int rel;
  84. {
  85.     char *egate;
  86.  
  87.     egate = res_arp(iface,ARP_ETHER,gateway,bp);
  88.     if(egate != NULLCHAR)
  89.         return (*iface->output)(iface,egate,iface->hwaddr,IP_TYPE,bp);
  90.     return 0;
  91. }
  92. /* Send a packet with Ethernet header */
  93. int
  94. enet_output(iface,dest,source,type,data)
  95. struct iface *iface;    /* Pointer to interface control block */
  96. char *dest;        /* Destination Ethernet address */
  97. char *source;        /* Source Ethernet address */
  98. int16 type;        /* Type field */
  99. struct mbuf *data;    /* Data field */
  100. {
  101.     struct ether ep;
  102.     struct mbuf *bp;
  103.  
  104.     memcpy(ep.dest,dest,EADDR_LEN);
  105.     memcpy(ep.source,source,EADDR_LEN);
  106.     ep.type = type;
  107.     if((bp = htonether(&ep,data)) == NULLBUF){
  108.         free_p(data);
  109.         return -1;
  110.     }
  111.     return (*iface->raw)(iface,bp);
  112. }
  113. /* Process incoming Ethernet packets. Shared by all ethernet drivers. */
  114. void
  115. eproc(iface,bp)
  116. struct iface *iface;
  117. struct mbuf *bp;
  118. {
  119.     struct ether hdr;
  120.     char multicast;
  121.  
  122.     /* Remove Ethernet header and kick packet upstairs */
  123.     ntohether(&hdr,&bp);
  124.     if(hdr.dest[0] & 1)
  125.         multicast = 1;
  126.     else
  127.         multicast = 0;
  128.     switch(hdr.type){
  129.     case ARP_TYPE:
  130.         arp_input(iface,bp);
  131.         break;
  132.     case IP_TYPE:
  133.         ip_route(bp,multicast);
  134.         break;
  135.     default:
  136.         free_p(bp);
  137.         break;
  138.     }
  139. }
  140.  
  141.